package com.bjfl.saleManager.util;


import com.baidu.tts.auth.AuthInfo;
import com.baidu.tts.client.SpeechSynthesizer;
import com.baidu.tts.client.TtsMode;
import com.log.LatteLogger;

import java.util.HashMap;
import java.util.Map;

import static com.bjfl.saleManager.util.MainHandlerConstant.INIT_SUCCESS;

/**
 */

public class BaiduTTSSpeakUtil {

    private static final String tag = "Baidu";
    private static final String APPID = "10487160";
    private static final String APPKEY = "LdE8ifCDVHNwiwoQNcOjyIa8";

    private static final String SECRETKEY = "7IRQZRGHjEEmkVf1Ia9IPq28X3opkPi0";
    protected static OfflineResource offlineResource;
    private static SpeechSynthesizer synthesizer;

    public static BaiduTTSSpeakUtil getInstance() {
        return BaiduTTSSpeakUtilHolder.INSTANCE;
    }

    private BaiduTTSSpeakUtil() {
        init();
    }

    private void init() {
        try {
            LatteLogger.i(tag, "百度语音初始化开始");

            InitConfig config = new InitConfig(APPID, APPKEY, SECRETKEY, TtsMode.MIX, OfflineResource.VOICE_FEMALE,
                    getParam(), null);
            offlineResource = new OfflineResource(LogUtil.context, config.getOfflineVoice());
            synthesizer = SpeechSynthesizer.getInstance();
            synthesizer.setContext(LogUtil.context);
            synthesizer.setSpeechSynthesizerListener(new MessageListener());


            // 请替换为语音开发者平台上注册应用得到的App ID ,AppKey ，Secret Key ，填写在SynthActivity的开始位置
            synthesizer.setAppId(config.getAppId());
            synthesizer.setApiKey(config.getAppKey(), config.getSecretKey());
            synthesizer.setParam(SpeechSynthesizer.PARAM_TTS_TEXT_MODEL_FILE, offlineResource.getTextFilename()); // 文本模型文件路径 (离线引擎使用)
            synthesizer.setParam(SpeechSynthesizer.PARAM_TTS_SPEECH_MODEL_FILE, offlineResource.getModelFilename());  // 声学模型文件路径 (离线引擎使用)
            LatteLogger.d("baidu离线资源路径：" + offlineResource.getTextFilename() + ":" + offlineResource.getModelFilename());

            // 授权检测接口(只是通过AuthInfo进行检验授权是否成功。选择纯在线可以不必调用auth方法。
            AuthInfo authInfo = synthesizer.auth(config.getTtsMode());
            if (!authInfo.isSuccess()) {
                // 离线授权需要网站上的应用填写包名。本demo的包名是com.baidu.tts.sample，定义在build.gradle中
                String errorMsg = authInfo.getTtsError().getDetailMessage();
                LatteLogger.d("baidu鉴权失败 =" + errorMsg);
            } else {
                LatteLogger.d("baidu验证通过，离线正式授权文件存在。");
            }
            setParams(config.getParams());
            int result = synthesizer.initTts(config.getTtsMode());
            if (result != 0) {
                LatteLogger.d("baidu【error】initTts 初始化失败 + errorCode：" + result);
            }
            // 此时可以调用 speak和synthesize方法
            LatteLogger.d("baidu" + INIT_SUCCESS, "合成引擎初始化成功");
        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    public void setParams(Map<String, String> params) {
        if (params != null) {
            for (Map.Entry<String, String> e : params.entrySet()) {
                synthesizer.setParam(e.getKey(), e.getValue());
            }
        }
    }

    /**
     * 合成并播放
     *
     * @param text 小于1024 GBK字节，即512个汉字或者字母数字
     * @return
     */
    public int speak(String text) {
        LatteLogger.i("baidu", "speak text:" + text);
        if (synthesizer == null){
            init();
        }
        return synthesizer.speak(text);
    }

    /**
     * 合成并播放
     *
     * @param text        小于1024 GBK字节，即512个汉字或者字母数字
     * @param utteranceId 用于listener的回调，默认"0"
     * @return
     */
    public int speak(String text, String utteranceId) {
        return synthesizer.speak(text, utteranceId);
    }

    public int pause() {
        return synthesizer.pause();
    }

    public int resume() {
        return synthesizer.resume();
    }

    public int stop() {
        return synthesizer.stop();
    }

    private Map<String, String> getParam() {
        Map<String, String> params = new HashMap<String, String>();
        // 以下参数均为选填
        params.put(SpeechSynthesizer.PARAM_SPEAKER, "0"); // 设置在线发声音人： 0 普通女声（默认） 1 普通男声 2 特别男声 3 情感男声<度逍遥> 4 情感儿童声<度丫丫>
        params.put(SpeechSynthesizer.PARAM_VOLUME, "5"); // 设置合成的音量，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_SPEED, "5");// 设置合成的语速，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_PITCH, "5");// 设置合成的语调，0-9 ，默认 5
        params.put(SpeechSynthesizer.PARAM_MIX_MODE, SpeechSynthesizer.MIX_MODE_DEFAULT);         // 该参数设置为TtsMode.MIX生效。即纯在线模式不生效。
        // MIX_MODE_DEFAULT 默认 ，wifi状态下使用在线，非wifi离线。在线状态下，请求超时6s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE_WIFI wifi状态下使用在线，非wifi离线。在线状态下， 请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_NETWORK ， 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
        // MIX_MODE_HIGH_SPEED_SYNTHESIZE, 2G 3G 4G wifi状态下使用在线，其它状态离线。在线状态下，请求超时1.2s自动转离线
        return params;
    }
    public static void release() {
        if (synthesizer != null){
            synthesizer.stop();
            synthesizer.release();
            synthesizer = null;
        }

    }
    private static final class BaiduTTSSpeakUtilHolder {
        private static final BaiduTTSSpeakUtil INSTANCE = new BaiduTTSSpeakUtil();
    }

}
